package com.yxx.utils;

import nl.basjes.parse.useragent.UserAgent;
import nl.basjes.parse.useragent.UserAgentAnalyzer;

import java.util.HashMap;
import java.util.Map;

/**
 * 浏览器工具类 解析用户代理字符串，提取操作系统和浏览器信息
 * @author yuxiangxun
 * @date 2025/1/18
 * @apiNote
 */
public class UserAgentUtils {
    /**
     * 静态初始化块中创建并配置 UserAgentAnalyzer 实例。
     * 该实例用于解析用户代理字符串，并提取特定字段。
     */
    private static final UserAgentAnalyzer USER_AGENT_ANALYZER;

    static {
        // 创建 UserAgentAnalyzer 实例，隐藏匹配加载统计信息，并指定要解析的字段
        USER_AGENT_ANALYZER = UserAgentAnalyzer
                .newBuilder()
                // 隐藏匹配器加载统计信息
                .hideMatcherLoadStats()
                // 包含操作系统名称和主要版本号
                .withField(UserAgent.OPERATING_SYSTEM_NAME_VERSION_MAJOR)
                // 包含浏览器名称和版本
                .withField(UserAgent.AGENT_NAME_VERSION)
                .build();
    }

    /**
     * 解析用户代理字符串，提取操作系统和浏览器信息。
     *
     * @param userAgent 用户代理字符串
     * @return 包含操作系统和浏览器信息的 Map，键为 "os" 和 "browser"
     */
    public static Map<String,String> parseOsAndBrowser(String userAgent) {
        // 使用 USER_AGENT_ANALYZER 解析用户代理字符串
        UserAgent agent = USER_AGENT_ANALYZER.parse(userAgent);
        // 提取操作系统名称和主要版本号
        String os = agent.getValue(UserAgent.OPERATING_SYSTEM_NAME_VERSION_MAJOR);
        // 提取浏览器名称和版本
        String browser = agent.getValue(UserAgent.AGENT_NAME_VERSION);
        // 创建并返回包含操作系统和浏览器信息的 Map
        Map<String,String> map = new HashMap<>(2);
        map.put("os",os);
        map.put("browser",browser);
        return map;
    }

}
